package per.dg.basicusereflex;


import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 1、反射涉及的类(Class类位于 java.lang 包下；其他的位于 java.lang.reflect 包下)
 * Class类：代表一个类
 * Field类：代表类的成员变量（成员变量也称为类的属性）
 * Method类：代表类的方法
 * Constructor类：代表类的构造方法
 * Array类：提供了动态创建数组，以及访问数组的元素的静态方法
 *
 * 2、反射可以实现的功能
 * 在运行时判断任意一个对象所属的类
 * 在运行时构造任意一个类的对象
 * 在运行时判断任意一个类所具有的成员变量和方法
 * 在运行时调用任意一个对象的方法
 * 动态代理
 *
 * 3、Class 类的主要方法
 * getName()：获得类的完整名字
 * getFields()：获得类的public类型的属性
 * getDeclaredFields()：获得类的所有属性
 * getField(String name)：获得类的指定名字的public类型的属性
 * getDeclaredField(String name)：获得类的指定名字的属性
 * getMethods()：获得类的public类型的方法
 * getDeclaredMethods()：获得类的所有方法
 * getMethod(String name, Class<?>... parameterTypes)：获得类的public修饰的特定方法，name参数指定方法的名字，parameterTypes参数指定方法的参数类型
 * getDeclaredMethod(String name, Class<?>... parameterTypes)：获得类的特定方法，name参数指定方法的名字，parameterTypes参数指定方法的参数类型
 * getConstrutors()：获得类的public类型的构造方法
 * getConstrutor(Class[] parameterTypes)：获得类的特定构造方法，parameterTypes参数指定构造方法的参数类型
 * newInstance()：通过类的不带参数的构造方法创建这个类的一个对象
 */

public class ReflexUtil {

    /**
     * 通过实例获取 Class
     * @param instance
     * @return
     */
    public static Class getClassForInstance(Object instance){
        return instance.getClass();
    }

    /**
     * 通过全限定路径名获取 Class
     * @param fullQualifiedPathname
     * @return
     * @throws ClassNotFoundException
     */
    public static Class getClassForSimpleName(String fullQualifiedPathname) throws ClassNotFoundException {
        return Class.forName(fullQualifiedPathname);
    }

}
